package com.pokermind.model.dto;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.math.BigDecimal;
import java.util.List;

/**
 * 创建新手牌请求DTO
 * 
 * V4.8 重大变更（Breaking Change）：
 * - 盲注字段改为可选，不再由后端自动记录盲注行动
 * - 前端需通过 RECORD_ACTION_REQ 主动发起盲注行动
 * - small_blind, big_blind, ante, straddle 字段保留用于配置参考（可选）
 * 
 * V4.1变更：
 * - 增加强抓（Straddle）配置
 * - PlayerInfo移除冗余字段（player_name, action_order, hole_cards）
 *
 * @author PokerMind Team
 */
@JsonIgnoreProperties(ignoreUnknown = true)  // V4.8: 兼容前端发送的旧字段（如 small_blind, big_blind）
public class CreateHandRequest {

    @JsonProperty("table_id")
    private String tableId;

    @JsonProperty("hand_id")
    private String handId;

    @JsonProperty("button_seat")
    private Integer buttonSeat;

    /**
     * V4.8: 小盲金额（必需）
     * 用于记录盲注配置信息，后端不会自动创建盲注行动
     * 实际盲注行动由前端通过 RECORD_ACTION_REQ 主动发起
     */
    @JsonProperty("small_blind")
    private BigDecimal smallBlind;

    /**
     * V4.8: 大盲金额（必需）
     * 用于记录盲注配置信息，后端不会自动创建盲注行动
     * 实际盲注行动由前端通过 RECORD_ACTION_REQ 主动发起
     */
    @JsonProperty("big_blind")
    private BigDecimal bigBlind;

    /**
     * V4.8: 前注金额（可选）
     * 仅用于记录配置信息，后端不会自动创建前注行动
     */
    private BigDecimal ante;
    
    /**
     * 游戏类型：holdem（德州）、shortdeck（短牌）、omaha（奥马哈）
     * V4.7新增：用于记录游戏类型
     */
    @JsonProperty("game_type")
    private String gameType;

    /**
     * V4.8: 强抓（Straddle）配置（可选）
     * 用于记录 Straddle 配置信息（位置、倍数）
     * 实际 Straddle 行动由前端通过 RECORD_ACTION_REQ 主动发起
     * 强抓规则：通常由UTG在发牌前主动投入2倍大盲，并获得最后行动权
     */
    private StraddleConfig straddle;

    private List<PlayerInfo> players;

    // 默认构造函数
    public CreateHandRequest() {
    }

    // Getters and Setters
    public String getHandId() {
        return handId;
    }

    public void setHandId(String handId) {
        this.handId = handId;
    }

    public String getTableId() {
        return tableId;
    }

    public void setTableId(String tableId) {
        this.tableId = tableId;
    }

    public Integer getButtonSeat() {
        return buttonSeat;
    }

    public void setButtonSeat(Integer buttonSeat) {
        this.buttonSeat = buttonSeat;
    }

    public BigDecimal getSmallBlind() {
        return smallBlind;
    }

    public void setSmallBlind(BigDecimal smallBlind) {
        this.smallBlind = smallBlind;
    }

    public BigDecimal getBigBlind() {
        return bigBlind;
    }

    public void setBigBlind(BigDecimal bigBlind) {
        this.bigBlind = bigBlind;
    }

    public BigDecimal getAnte() {
        return ante;
    }

    public void setAnte(BigDecimal ante) {
        this.ante = ante;
    }

    public String getGameType() {
        return gameType;
    }

    public void setGameType(String gameType) {
        this.gameType = gameType;
    }

    public List<PlayerInfo> getPlayers() {
        return players;
    }

    public void setPlayers(List<PlayerInfo> players) {
        this.players = players;
    }

    public StraddleConfig getStraddle() {
        return straddle;
    }

    public void setStraddle(StraddleConfig straddle) {
        this.straddle = straddle;
    }

    /**
     * 强抓（Straddle）配置
     */
    public static class StraddleConfig {
        /**
         * 强抓位置（通常是UTG）
         */
        private String position;
        
        /**
         * 强抓倍数（相对于BB）
         * multiplier=0 表示不启用强抓
         * multiplier>0 表示启用强抓（如2表示2倍BB）
         */
        private Integer multiplier;

        public StraddleConfig() {
        }

        public StraddleConfig(String position, Integer multiplier) {
            this.position = position;
            this.multiplier = multiplier;
        }

        public String getPosition() {
            return position;
        }

        public void setPosition(String position) {
            this.position = position;
        }

        public Integer getMultiplier() {
            return multiplier;
        }

        public void setMultiplier(Integer multiplier) {
            this.multiplier = multiplier;
        }
    }

    /**
     * 玩家信息内部类 - V4.1精简版
     * 移除了player_name, action_order, hole_cards（这些字段不应该在创建手牌时提供）
     */
    @JsonIgnoreProperties(ignoreUnknown = true)  // 忽略客户端发送的未知字段
    public static class PlayerInfo {
        @JsonProperty("player_id")
        private String playerId;  // 玩家唯一标识，必须

        @JsonProperty("seat_number")
        private Integer seatNumber; //座位号(1-6)

        private BigDecimal stack; // 起始筹码数
        
        @JsonProperty("position")
        private String position;  // 位置信息: BTN/SB/BB/UTG/MP/CO

        // 构造函数
        public PlayerInfo() {
        }

        public PlayerInfo(String playerId, Integer seatNumber, String position, BigDecimal stack) {
            this.playerId = playerId;
            this.seatNumber = seatNumber;
            this.position = position;
            this.stack = stack;
        }

        // Getters and Setters
        public String getPlayerId() {
            return playerId;
        }

        public void setPlayerId(String playerId) {
            this.playerId = playerId;
        }

        public Integer getSeatNumber() {
            return seatNumber;
        }

        public void setSeatNumber(Integer seatNumber) {
            this.seatNumber = seatNumber;
        }

        public BigDecimal getStack() {
            return stack;
        }

        public void setStack(BigDecimal stack) {
            this.stack = stack;
        }
        
        public String getPosition() {
            return position;
        }
        
        public void setPosition(String position) {
            this.position = position;
        }
    }
}